<?php
/*
 * Controllのテスト
 * 
 * 実際のルーティング処理はメインルーチンが走るため割愛。
 * どちらにしろ動作確認や他のテストで担保可能。
 */
require_once(dirname(__FILE__). '/../define.php');
require_once(dirname(__FILE__). '/../yutori.class.php');
require_once(dirname(__FILE__). '/../../../SimpleTest/autorun.php');
SimpleTest::preferred('HtmlReporter')->__construct('UTF-8');


class TestCaseofControl extends UnitTestCase {
	function __construct () {
		include_once (USE_CONTROL_MODULE);
		Y('Control.App')->set (null);
		Y('Control.Request')->set (null);
		Y('Control')->call('WEB');
	}

	// オブジェクト配置のテスト
	function TestofTree () {
		$this->assertTrue (Y('Module.Control')->get() instanceof Control, 'Module.ControlがControlクラスのインスタンスであるか');
		$this->assertTrue (Y('Control')->get() instanceof Control, 'ControlがControlクラスのインスタンスであるか');
		$this->assertFalse (Y('Control.Method')->isEmpty (), 'Control.MethodがEmptyになっていないか');

		$this->assertEqual (Y('Server')->get(), $_SERVER, '$_SERVERを正常に取り込めているか');
		$this->assertEqual (Y('Get')->get(), $_GET, '$_GETを正常に取り込めているか');
		$this->assertEqual (Y('Post')->get(), $_POST, '$_POSTを正常に取り込めているか');
		$this->assertEqual (Y('Env')->get(), $_ENV, '$_ENVを正常に取り込めているか');
	}

	// control.method.pathinfoのテスト
	function TestofPathInfo () {
		$this->assertEqual (Y('Control.Method.PathInfo')->getType (), YuTori::TYPE_CALLABLE, 'Control.Method.PathInfoがcallable型かどうか');

		// path_infoがないときはsetがきかないのでaddしておく。
		Y('Server')->add('', 'Path_Info');

		Y('Control.Reset')->call();
		Y('Server.Path_Info')->set('/');
		$this->assertIdentical (Y('Control.Method.PathInfo')->call(), '', 'ドキュメントルートアクセス時は空文字を返す');
		$this->assertIdentical (Y('Control.Method.PathInfo')->call(), false, 'ドキュメントルートアクセス時は空文字を返したあとfalseを返す');

		Y('Control.Reset')->call();
		Y('Server.Path_Info')->set('/app.php');
		$this->assertIdentical ($res = Y('Control.Method.PathInfo')->call(), 'app.php', 'ルート直下のPHPへのアクセス:'.$res);
		$this->assertIdentical (Y('Control.Method.PathInfo')->call(), false, 'ルート直下のPHPへのアクセス２回目');

		Y('Control.Reset')->call();
		Y('Server.Path_Info')->set('/test/');
		$this->assertIdentical (Y('Control.Method.PathInfo')->call(), 'test', 'ルート直下のディレクトリへのアクセス');
		$this->assertIdentical (Y('Control.Method.PathInfo')->call(), false, 'ルート直下のディレクトリへのアクセス２回目');

		Y('Control.Reset')->call();
		Y('Server.Path_Info')->set('/test/app.php');
		$this->assertIdentical (Y('Control.Method.PathInfo')->call(), 'test', 'ルート直下のディレクトリのPHPへのアクセス');
		$this->assertIdentical (Y('Control.Method.PathInfo')->call(), 'app.php', 'ルート直下のディレクトリのPHPへのアクセス２回目');
		$this->assertIdentical (Y('Control.Method.PathInfo')->call(), false, 'ルート直下のディレクトリのPHPへのアクセス3回目');

		Y('Control.Reset')->call();
		Y('Server.Path_Info')->set('/test/test2/app.php');
		$this->assertIdentical (Y('Control.Method.PathInfo')->call(), 'test', '2回ディレクトリが続いたPHPへのアクセス');
		$this->assertIdentical (Y('Control.Method.PathInfo')->call(), 'test2', '2回ディレクトリが続いたPHPへのアクセス２回目');
		$this->assertIdentical (Y('Control.Method.PathInfo')->call(), 'app.php', '2回ディレクトリが続いたPHPへのアクセス3回目');
		$this->assertIdentical (Y('Control.Method.PathInfo')->call(), false, '2回ディレクトリが続いたPHPへのアクセス4回目');

	}
}
 